<?php

namespace App\Http\Controllers\Web;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\File;
use Intervention\Image\Facades\Image;
use SimpleSoftwareIO\QrCode\Facades\QrCode;

class QrController extends Controller{
    /**
     * @var $dftName 默认的图片名称
     */
    protected $dftName;
    protected $dftCatalog; //默认的存储图片的路径
    /**
     * 展示页面
     */
    public function index(Request $request){
        $backPath = "/back.png";  //背景图片地址
        $logoPath = "/logo.png";  //logo地址
//        $logoPath = "http://thirdwx.qlogo.cn/mmopen/OyA3F5sbM1sp3kdRUn5N6YfjVrBdibE7PH4E9cu4kFZ6JtPNqA2bdiaMmicOwvFSboEq7E0BNHHjzd28YALrpQJPw/132";  //logo地址


        $dftName    = $this->dftName    = date("YmdHis").rand(1,9999).".png";  //默认的图片名称
        $dftCatalog = $this->dftCatalog = date("Y")."/".date("m") . "/";//默认的存储图片的路径
        $qrPath     = "qrcode/".$dftCatalog; //二维码的存储路径

        //检查并创建目录
        $this->CheckCatalog($qrPath);

        //1：二维码
        $this->getQrCode($qrPath,$logoPath,$dftName);
        $qr = $qrPath.$dftName;

        //2：模板图开始加并二维码
        $newBack = $this->mergeImgs($backPath,$qr);

        //3:（模板+二维码图）开始加并头像
        $back = $this->mergeImgs($newBack,$logoPath,"head");

        //4:（模板+二维码+头像图）加并文字
        $this->wordsUpImg($back,"鲁智深");

        $tmpPath = "images/".$this->dftCatalog.$this->dftName;
        echo "<img src='".$tmpPath."' style='width:360px;height:640px;'>";
    }

    /**
     * 生成二维码
     * @param $qrPath  二维码的存储目录
     * @param $dftName 二维码的名称
     */
    public function getQrCode($qrPath,$logoPath,$dftName){
        QrCode::encoding('UTF-8')         //编码
        ->format('png')                   //图片格式
        ->size(250)                       //图片大小
        ->color(255,0,255)                //二维码颜色：RBG格式颜色
        ->backgroundColor(255,255,0)      //背景色：RBG格式颜色
        ->margin(1)                       //二维码的外边距
        ->errorCorrection('M')            //二维码容错率：L  7% 的字节码恢复率；M	15% 的字节码恢复率；Q 	25% 的字节码恢复率；H	 30% 的字节码恢复率
        ->merge(public_path().$logoPath,.3,true)  //加logo：（图片位置，logo的百分比，使用绝对路径）
        ->generate("哈哈哈，我是封泽生",$qrPath.$dftName);
    }

    /**
     * 两张图片进行合并
     */
    public function mergeImgs($backPath,$targetPath,$idea = "qr"){
        $backRes   = $this->gdResource($backPath);
        $targetRes = $this->gdResource($targetPath);

        /*
         dst_image 背景图
         src_image 待载入的图片
         dst_x 设定待载入图片在背景图中的x坐标
         dst_y 设定待载入图片在背景图中的y坐标
         src_x 设定待载入图片要载入的区域x坐标
         src_y 设定待载入图片要载入的区域y坐标
         dst_w 设定待载入的原图的宽度（在此设置缩放）
         dst_h 设定待载入的原图的高度（在此设置缩放）
         src_w 背景图要载入的宽度  ：imagesx() 获取图片的宽度
         src_h 背景图要载入的高度  ：imagesy() 获取图片的高度
         */

        $bg_w = imagesx($backRes);  //背景图宽
        $bg_h = imagesy($backRes);  //背景图高

        if($idea == 'qr'){  //加并二维码
            $outPath = "images/".$this->dftCatalog;
            //检查并创建目录
            $this->CheckCatalog($outPath);

            $outName = $outPath.$this->dftName;  // 输出时的文件名称

            $dst_w = 90;  //待合并图片(二维码)加并后的宽度
            $dst_h = 90;  //待合并图片(二维码)加并后的高度

            //待载入图片加并后的X轴方向上的坐标
            $dst_x = ($bg_w - $dst_w) / 2;
            /*
             * 待载入图片加并后的Y轴方向上的坐标
             * 80 为距离背景图底部的距离
             */
            $dst_y = $bg_h - $dst_h - 80;
        }else{ //加并头像
            $outName = $backPath;  // 输出时的文件名称

            $dst_w = 45;  //待加并头像加并后的宽度
            $dst_h = 45;  //待加并头像加并后的高度

            $dst_x = 100;  //待载入图片加并后的X轴方向上的坐标
            $dst_y = $bg_h - 250 - 300;  //待载入图片加并后的Y轴方向上的坐标
        }

        imagecopyresampled($backRes, $targetRes, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, imagesx($targetRes), imagesy($targetRes));
        //以png格式输出
        $res = imagepng($backRes, $outName);
        if($res){
            return $outName;
        }else{
            return false;
        }
    }

    /**
     * 将文字写到图片上并生成输出
     * @param $back 背景图片地址
     * @param $text 文本内容
     * @return \Intervention\Image\Image
     */
    public function wordsUpImg($back,$text){
        $img = Image::make($back); //背景图的地址

        $img->text($text, 150, 260, function($font) {
            $font->file(public_path('font/simhei.ttf')); //字体的地址，地址错误会报GD库的错
            $font->size(18);
            $font->color('#000000');
            // $font->align('center');
            // $font->valign('top');
            // $font->angle(45);
        });

//        $img->text($text, 150, 360, function($font) {
//            $font->file(public_path('font/simhei.ttf')); //字体的地址，地址错误会报GD库的错
//            $font->size(18);
//            $font->color('#000000');
//        });
        return $img->save($back);
    }

    /**
     * 获取图片的资源
     * @param $path 图片地址
     * @return false|resource
     */
    public function gdResource($path){
        $path = public_path($path);
        $mime = getimagesize($path)['mime'];
        $ext  = explode("/",$mime)[1];
        switch($ext){
            case "png":
                $image = imagecreatefrompng($path);
                break;
            case "jpeg":
                $image = imagecreatefromjpeg($path);
                break;
            case "jpg":
                $image = imagecreatefromjpeg($path);
                break;
            case "gif":
                $image = imagecreatefromgif($path);
                break;
        }
        return $image;
    }

    /**
     * 检查目录是否存在
     * @param $dir 目录地址
     * @return bool
     */
    public function checkCatalog($dir){
        return File::isDirectory($dir) or File::makeDirectory($dir, 0777, true, true);
    }
}

